package com.correction.service;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;

import com.correction.classes.Exercice;
import com.correction.classes.Utilisateur;
import com.correction.classes.Utilisateur.Niveau;
import com.correction.classes.Utilisateur.TypeUser;
import com.correction.utils.HibernateUtil;

public class UtilisateurDAO {

	public static Utilisateur saveUtilisateur(Utilisateur user) {
		Session session = HibernateUtil.getSessionFactory().openSession();
		Transaction transaction = null;
		try {
			transaction = session.beginTransaction();
			session.saveOrUpdate(user);
			transaction.commit();
		} catch (HibernateException e) {
			transaction.rollback();
			e.printStackTrace();
		} finally {
			session.close();
		}
		return user;
	}
	
	public static Utilisateur getUtilisateur(int id) {
		Session session = HibernateUtil.getSessionFactory().openSession();
		Utilisateur util = null;
		String hql = "FROM Utilisateur u where (u.idUtilisateur='" + id + "')";
		util = (Utilisateur) session.createQuery(hql).uniqueResult();
		session.close();

		return util;
	}
	
	public static void deleteUtilsateur(Utilisateur user) {
		Session session = HibernateUtil.getSessionFactory().openSession();
		user.getExamens().clear();
		user.getNotesExamens().clear();
		user.getNotesExercices().clear();
		user.getExecrices().clear();
		session.saveOrUpdate(user);
		Transaction transaction = null;
		try {
			transaction = session.beginTransaction();
			session.delete(user);
			transaction.commit();
		} catch (HibernateException e) {
			transaction.rollback();
			e.printStackTrace();
		} finally {
			session.close();
		}
		
	}

	public static List<Utilisateur> getAll() {
		Session session = HibernateUtil.getSessionFactory().openSession();
		Transaction transaction = null;
		List<Utilisateur> users = null;
		try {
			transaction = session.beginTransaction();
			users = session.createCriteria(Utilisateur.class).list();
			transaction.commit();
		} catch (HibernateException e) {
			transaction.rollback();
			e.printStackTrace();
		} finally {
			session.close();
		}
		return users;
	}

	public static List<Utilisateur> getUsers() {
		Session session = HibernateUtil.getSessionFactory().openSession();
		Transaction transaction = null;
		List<Utilisateur> users = null;
		List<Utilisateur> usersNew = new ArrayList<Utilisateur>();
		try {
			transaction = session.beginTransaction();
			users = session.createCriteria(Utilisateur.class).list();
			transaction.commit();
		} catch (HibernateException e) {
			transaction.rollback();
			e.printStackTrace();
		} finally {
			session.close();
		}
		for (Utilisateur utilisateur : users) {
			if (!utilisateur.getType().equals(TypeUser.ADMIN)) {
				usersNew.add(utilisateur);
			}
		}
		return usersNew;
	}
	public static List<Utilisateur> getProfesseurs() {
		Session session = HibernateUtil.getSessionFactory().openSession();
		Transaction transaction = null;
		List<Utilisateur> users = null;
		List<Utilisateur> usersNew = new ArrayList<Utilisateur>();
		try {
			transaction = session.beginTransaction();
			users = session.createCriteria(Utilisateur.class).list();
			transaction.commit();
		} catch (HibernateException e) {
			transaction.rollback();
			e.printStackTrace();
		} finally {
			session.close();
		}
		for (Utilisateur utilisateur : users) {
			if (utilisateur.getType().equals(TypeUser.PROFESSEURS)) {
				usersNew.add(utilisateur);
			}
		}
		return usersNew;
	}
	
	public static List<Utilisateur> getEtudiants(Niveau niveau) {
		Session session = HibernateUtil.getSessionFactory().openSession();
		Transaction transaction = null;
		List<Utilisateur> users = null;
		List<Utilisateur> usersNew = new ArrayList<Utilisateur>();
		try {
			transaction = session.beginTransaction();
			users = session.createCriteria(Utilisateur.class).list();
			transaction.commit();
		} catch (HibernateException e) {
			transaction.rollback();
			e.printStackTrace();
		} finally {
			session.close();
		}
		for (Utilisateur utilisateur : users) {
			if (utilisateur.getType().equals(TypeUser.NORMAL) && utilisateur.getNiveau().equals(niveau)) {
				usersNew.add(utilisateur);
			}
		}
		return usersNew;
	}

	public static Utilisateur getUtilisateur(String mail, String pwd) {
		Session session = HibernateUtil.getSessionFactory().openSession();
		Utilisateur utilisateur = null;
		String hql = "FROM Utilisateur u where (u.mail='" + mail
				+ "' and u.pwd='" + pwd + "')";
		utilisateur = (Utilisateur) session.createQuery(hql).uniqueResult();
		session.close();

		return utilisateur;
	}
}
